var dtd = ((function() {
  function _(s) {
    for (var k in s) {
      s[k.toUpperCase()] = s[k];
    }
    return s;
  }
  var X = function(t) {
    var a = arguments;
    for (var i = 1; i < a.length; i++) {
      var x = a[i];
      for (var k in x) {
        if (!t.hasOwnProperty(k)) {
          t[k] = x[k];
        }
      }
    }
    return t;
  };
  var A = _({ isindex: 1, fieldset: 1 });
  var B = _({ input: 1, button: 1, select: 1, textarea: 1, label: 1 });
  var C = X(_({ a: 1 }), B);
  var D = X({ iframe: 1 }, C);
  var E = _({
    hr: 1,
    ul: 1,
    menu: 1,
    div: 1,
    blockquote: 1,
    noscript: 1,
    table: 1,
    center: 1,
    address: 1,
    dir: 1,
    pre: 1,
    h5: 1,
    dl: 1,
    h4: 1,
    noframes: 1,
    h6: 1,
    ol: 1,
    h1: 1,
    h3: 1,
    h2: 1
  });
  var F = _({ ins: 1, del: 1, script: 1, style: 1 });
  var G = X(
    _({
      mark: 1,
      b: 1,
      acronym: 1,
      bdo: 1,
      var: 1,
      '#': 1,
      abbr: 1,
      code: 1,
      br: 1,
      i: 1,
      cite: 1,
      kbd: 1,
      u: 1,
      strike: 1,
      s: 1,
      tt: 1,
      strong: 1,
      q: 1,
      samp: 1,
      em: 1,
      dfn: 1,
      span: 1
    }),
    F
  );
  var H = X(
    _({
      sub: 1,
      img: 1,
      embed: 1,
      object: 1,
      sup: 1,
      basefont: 1,
      map: 1,
      applet: 1,
      font: 1,
      big: 1,
      small: 1
    }),
    G
  );
  var I = X(_({ p: 1 }), H);
  var J = X(_({ iframe: 1 }), H, B);
  var K = _({
    img: 1,
    embed: 1,
    noscript: 1,
    br: 1,
    kbd: 1,
    center: 1,
    button: 1,
    basefont: 1,
    h5: 1,
    h4: 1,
    samp: 1,
    h6: 1,
    ol: 1,
    h1: 1,
    h3: 1,
    h2: 1,
    form: 1,
    font: 1,
    '#': 1,
    select: 1,
    menu: 1,
    ins: 1,
    abbr: 1,
    label: 1,
    code: 1,
    table: 1,
    script: 1,
    cite: 1,
    input: 1,
    iframe: 1,
    strong: 1,
    textarea: 1,
    noframes: 1,
    big: 1,
    small: 1,
    span: 1,
    hr: 1,
    sub: 1,
    bdo: 1,
    var: 1,
    div: 1,
    object: 1,
    sup: 1,
    strike: 1,
    dir: 1,
    map: 1,
    dl: 1,
    applet: 1,
    del: 1,
    isindex: 1,
    fieldset: 1,
    ul: 1,
    b: 1,
    acronym: 1,
    a: 1,
    blockquote: 1,
    i: 1,
    u: 1,
    s: 1,
    tt: 1,
    address: 1,
    q: 1,
    pre: 1,
    p: 1,
    em: 1,
    dfn: 1
  });
  var L = X(_({ a: 0 }), J); //a不能被切开，所以把他
  var M = _({ tr: 1 });
  var N = _({ '#': 1 });
  var O = X(_({ param: 1 }), K);
  var P = X(_({ form: 1 }), A, D, E, I);
  var Q = _({ li: 1, ol: 1, ul: 1 });
  var R = _({ style: 1, script: 1 });
  var S = _({ base: 1, link: 1, meta: 1, title: 1 });
  var T = X(S, R);
  var U = _({ head: 1, body: 1 });
  var V = _({ html: 1 });

  var block = _({
    address: 1,
    blockquote: 1,
    center: 1,
    dir: 1,
    div: 1,
    dl: 1,
    fieldset: 1,
    form: 1,
    h1: 1,
    h2: 1,
    h3: 1,
    h4: 1,
    h5: 1,
    h6: 1,
    hr: 1,
    isindex: 1,
    menu: 1,
    noframes: 1,
    ol: 1,
    p: 1,
    pre: 1,
    table: 1,
    ul: 1
  });
  var empty = _({
    area: 1,
    base: 1,
    basefont: 1,
    br: 1,
    col: 1,
    command: 1,
    dialog: 1,
    embed: 1,
    hr: 1,
    img: 1,
    input: 1,
    isindex: 1,
    keygen: 1,
    link: 1,
    meta: 1,
    param: 1,
    source: 1,
    track: 1,
    wbr: 1
  });

  return _({
    // $ 表示自定的属性

    // body外的元素列表.
    $nonBodyContent: X(V, U, S),

    //块结构元素列表
    $block: block,

    //内联元素列表
    $inline: L,

    $inlineWithA: X(_({ a: 1 }), L),

    $body: X(_({ script: 1, style: 1 }), block),

    $cdata: _({ script: 1, style: 1 }),

    //自闭和元素
    $empty: empty,

    //不是自闭合，但不能让range选中里边
    $nonChild: _({ iframe: 1, textarea: 1 }),
    //列表元素列表
    $listItem: _({ dd: 1, dt: 1, li: 1 }),

    //列表根元素列表
    $list: _({ ul: 1, ol: 1, dl: 1 }),

    //不能认为是空的元素
    $isNotEmpty: _({
      table: 1,
      ul: 1,
      ol: 1,
      dl: 1,
      iframe: 1,
      area: 1,
      base: 1,
      col: 1,
      hr: 1,
      img: 1,
      embed: 1,
      input: 1,
      textarea: 1,
      link: 1,
      meta: 1,
      param: 1,
      h1: 1,
      h2: 1,
      h3: 1,
      h4: 1,
      h5: 1,
      h6: 1
    }),

    //如果没有子节点就可以删除的元素列表，像span,a
    $removeEmpty: _({
      a: 1,
      abbr: 1,
      acronym: 1,
      address: 1,
      b: 1,
      bdo: 1,
      big: 1,
      cite: 1,
      code: 1,
      del: 1,
      dfn: 1,
      em: 1,
      font: 1,
      i: 1,
      ins: 1,
      label: 1,
      kbd: 1,
      q: 1,
      s: 1,
      samp: 1,
      small: 1,
      span: 1,
      strike: 1,
      strong: 1,
      sub: 1,
      sup: 1,
      tt: 1,
      u: 1,
      var: 1
    }),

    $removeEmptyBlock: _({ p: 1, div: 1 }),

    //在table元素里的元素列表
    $tableContent: _({
      caption: 1,
      col: 1,
      colgroup: 1,
      tbody: 1,
      td: 1,
      tfoot: 1,
      th: 1,
      thead: 1,
      tr: 1,
      table: 1
    }),
    //不转换的标签
    $notTransContent: _({ pre: 1, script: 1, style: 1, textarea: 1 }),
    html: U,
    head: T,
    style: N,
    script: N,
    body: P,
    base: {},
    link: {},
    meta: {},
    title: N,
    col: {},
    tr: _({ td: 1, th: 1 }),
    img: {},
    embed: {},
    colgroup: _({ thead: 1, col: 1, tbody: 1, tr: 1, tfoot: 1 }),
    noscript: P,
    td: P,
    br: {},
    th: P,
    center: P,
    kbd: L,
    button: X(I, E),
    basefont: {},
    h5: L,
    h4: L,
    samp: L,
    h6: L,
    ol: Q,
    h1: L,
    h3: L,
    option: N,
    h2: L,
    form: X(A, D, E, I),
    select: _({ optgroup: 1, option: 1 }),
    font: L,
    ins: L,
    menu: Q,
    abbr: L,
    label: L,
    table: _({
      thead: 1,
      col: 1,
      tbody: 1,
      tr: 1,
      colgroup: 1,
      caption: 1,
      tfoot: 1
    }),
    code: L,
    tfoot: M,
    cite: L,
    li: P,
    input: {},
    iframe: P,
    strong: L,
    textarea: N,
    noframes: P,
    big: L,
    small: L,
    //trace:
    span: _({
      '#': 1,
      br: 1,
      b: 1,
      strong: 1,
      u: 1,
      i: 1,
      em: 1,
      sub: 1,
      sup: 1,
      strike: 1,
      span: 1
    }),
    hr: L,
    dt: L,
    sub: L,
    optgroup: _({ option: 1 }),
    param: {},
    bdo: L,
    var: L,
    div: P,
    object: O,
    sup: L,
    dd: P,
    strike: L,
    area: {},
    dir: Q,
    map: X(_({ area: 1, form: 1, p: 1 }), A, F, E),
    applet: O,
    dl: _({ dt: 1, dd: 1 }),
    del: L,
    isindex: {},
    fieldset: X(_({ legend: 1 }), K),
    thead: M,
    ul: Q,
    acronym: L,
    b: L,
    a: X(_({ a: 1 }), J),
    blockquote: X(_({ td: 1, tr: 1, tbody: 1, li: 1 }), P),
    caption: L,
    i: L,
    u: L,
    tbody: M,
    s: L,
    address: X(D, I),
    tt: L,
    legend: L,
    q: L,
    pre: X(G, C),
    p: X(_({ a: 1 }), L),
    em: L,
    dfn: L,
    mark: L
  });
})());

export default dtd;
